---
title: "Copy 'plotly' image to the clipboard"
author: "Stéphane Laurent"
date: '2022-03-16'
tags: R, graphics, plotly, javascript
rbloggers: yes
output:
md_document:
variant: markdown
preserve_yaml: true
html_document:
highlight: kate
keep_md: no
highlighter: pandoc-solarized
---
The R code below shows how to get a *"Copy to clipboard"* button in the
`plotly` toolbar.
``` {.r .numberLines}
library(plotly)
set.seed(666L)
asd <- data.frame(
week = c(1, 2, 3, 4, 5, 6, 7, 8),
a = rpois(8L, 30),
b = rpois(8L, 25)
)
js <- c(
'function(gd) {',
' Plotly.Snapshot.toImage(gd, {format: "png"}).once(',
' "success",',
' async function(url) {',
' try {',
' const data = await fetch(url);',
' const blob = await data.blob();',
' await navigator.clipboard.write([',
' new ClipboardItem({',
' [blob.type]: blob',
' })',
' ]);',
' console.log("Image copied.");',
' var $div = $("
Image copied to clipboard
");',
' $div.css({',
' display: "none",',
' position: "absolute",',
' top: "5%",',
' left: "50%",',
' transform: "translate(-50%, 0)",',
' "font-size": "30px",',
' "font-family": "Tahoma, sans-serif",',
' "font-style": "italic",',
' "background-color": "seashell",',
' padding: "10px",',
' border: "2px solid black",',
' "border-radius": "5px"',
' });',
' $div.appendTo("body");',
' $div.fadeIn(3000, function() {',
' $div.fadeOut(3000);',
' });',
' } catch(err) {',
' console.error(err.name, err.message);',
' }',
' }',
' );',
'}'
)
SVGicon_path <- paste0(
"M97.67,20.81L97.67,20.81l0.01,0.02c3.7,0.01,7.04,1.51,9.46,3.93c2.4,2.",
"41,3.9,5.74,3.9,9.42h0.02v0.02v75.28 v0.01h-0.02c-0.01,3.68-1.51,7.03-",
"3.93,9.46c-2.41,2.4-5.74,3.9-9.42,3.9v0.02h-0.02H38.48h-0.01v-0.02 c-3",
".69-0.01-7.04-1.5-9.46-3.93c-2.4-2.41-3.9-5.74-3.91-9.42H25.1c0-25.96,",
"0-49.34,0-75.3v-0.01h0.02 c0.01-3.69,1.52-7.04,3.94-9.46c2.41-2.4,5.73",
"-3.9,9.42-3.91v-0.02h0.02C58.22,20.81,77.95,20.81,97.67,20.81L97.67,20",
".81z M0.02,75.38L0,13.39v-0.01h0.02c0.01-3.69,1.52-7.04,3.93-9.46c2.41",
"-2.4,5.74-3.9,9.42-3.91V0h0.02h59.19 c7.69,0,8.9,9.96,0.01,10.16H13.4h",
"-0.02v-0.02c-0.88,0-1.68,0.37-2.27,0.97c-0.59,0.58-0.96,1.4-0.96,2.27h",
"0.02v0.01v3.17 c0,19.61,0,39.21,0,58.81C10.17,83.63,0.02,84.09,0.02,75",
".38L0.02,75.38z M100.91,109.49V34.2v-0.02h0.02 c0-0.87-0.37-1.68-0.97-",
"2.27c-0.59-0.58-1.4-0.96-2.28-0.96v0.02h-0.01H38.48h-0.02v-0.02c-0.88,",
"0-1.68,0.38-2.27,0.97 c-0.59,0.58-0.96,1.4-0.96,2.27h0.02v0.01v75.28v0",
".02h-0.02c0,0.88,0.38,1.68,0.97,2.27c0.59,0.59,1.4,0.96,2.27,0.96v-0.0",
"2h0.01 h59.19h0.02v0.02c0.87,0,1.68-0.38,2.27-0.97c0.59-0.58,0.96-1.4,",
"0.96-2.27L100.91,109.49L100.91,109.49L100.91,109.49 L100.91,109.49z"
)
CopyToClipboard <- list(
name = "Copy",
icon = list(
path = SVGicon_path,
width = 111,
height = 123
),
click = htmlwidgets::JS(js)
)
plot_ly(
asd, x = ~week, y = ~a, name = "a", type = "scatter", mode = "lines"
) %>%
add_trace(y = ~b, name = "b", mode = "lines") %>%
layout(
margin = list(l = 100, r = 100, b = 100, t = 100),
xaxis = list(
title = "Week",
showgrid = FALSE,
rangemode = "normal"
),
yaxis = list(
title = "",
showgrid = FALSE,
rangemode = "tozero"
),
hovermode = "x unified"
) %>%
config(modeBarButtonsToAdd = list(CopyToClipboard))
```
![](figures/plotly_copyToClipboard.gif){width=75%}